<?php
if (!function_exists('finds')) {
    /**
     * 查询单条数据
     * @param string $sql sql语句
     * @return array 返回数据
     */
    function finds($sql)
    {
        global $conn;

        $data = [];

        $result = mysqli_query($conn, $sql);

        if ($result && mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
        }

        return $data;
    }
}

if (!function_exists('find')) {
    /**
     * 查询单条数据
     * @param string $sql sql语句
     * @return array 返回数据
     */
    function find($sql)
    {
        // 声明全局变量
        global $conn;

        $result = mysqli_query($conn, $sql);

        $data = [];

        if ($result && mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_assoc($result);
        }

        return $data;
    }
}

if (!function_exists('add')) {
    /**
     * 插入数据
     * @param string $table 表名
     * @param array $data 数据
     * @param array 返回结果集
     */
    function add($table, $data)
    {
        global $conn,
            $prefix_;

        // 拼接表名
        $table = $prefix_ . $table;

        // INSERT INTO `table`(`field`)VALUES('value')

        // 获取数组的索引
        $fieldArr = array_keys($data);

        // 数组的索引转成字符串
        $fields = "`" . implode('`,`', $fieldArr) . "`";

        // 获取值
        $values = "'" . implode("','", $data) . "'";
        // var_dump($values);
        // 组装sql语句
        $sql = "INSERT INTO `$table`($fields)VALUES($values)";

        $res = mysqli_query($conn, $sql);

        if ($res) {
            $result = [
                'code' => 1,
                'msg' => '插入数据成功',
                'data' => mysqli_insert_id($conn)
            ];
        } else {
            $result = [
                'code' => 0,
                'msg' => '插入数据失败',
                'data' => mysqli_error($conn)
            ];
        }

        return $result;
    }
}

if (!function_exists('del')) {
    /**
     * 删除数据
     * @param string $table 表名
     * @param string $where 删除条件
     * @return array 返回结果集
     */
    function del($table, $where)
    {
        global $conn,
            $prefix_;

        $table = $prefix_ . $table;

        // DELETE FROM `table` WHERE where;

        $sql = "DELETE FROM `$table` WHERE $where";

        $res = mysqli_query($conn, $sql);

        if ($res) {
            $result = [
                'code' => 1,
                'msg' => '删除数据成功',
                'data' => mysqli_affected_rows($conn)
            ];
        } else {
            $result = [
                'code' => 0,
                'msg' => '删除数据失败',
                'data' => mysqli_error($conn)
            ];
        }

        return $result;
    }
}
if(!function_exists('update'))
{
    /**
     * 更新数据
     * @param string $table 表名
     * @param array $data 更新数据
     * @param string $where 更新条件
     * @return array 返回结果集
    */
    function update($table,$data,$where)
    {
        global $conn,
               $prefix_;
        
        $table = $prefix_ . $table;

        // UPDATE `table` SET `field` = `val`,`field` = `val` WHERE `id` = $id
        $fieldStr = '';

        foreach($data as $key => $val)
        {
            $fieldStr .= "`" . $key . "`='" . $val . "',";
        }

        $field = rtrim($fieldStr,',');

        $sql = "UPDATE `$table` SET $field WHERE $where";

        $res = mysqli_query($conn,$sql);

        if($res)
        {
            $result = [
                'code' => 1,
                'msg' => '更新数据成功',
                'data' => mysqli_affected_rows($conn)
            ];
        }else{
            $result = [
                'code' => 0,
                'msg' => '更新数据失败',
                'data' => mysqli_error($conn)
            ];
        }

        return $result;
    }
}

if (!function_exists('success')) {
    /**
     * Ajax操作成功后返回数据结构的方法
     * @param string $msg 提示信息
     * @param ?array $data 数据
     * @param int $code 状态码
     * @return void 返回一个结果集
     */
    function success($msg, $data = null, $code = 1)
    {
        echo json_encode(['msg' => $msg, 'data' => $data, 'code' => $code]);
        exit;
    }
}

if (!function_exists('error')) {
    /**
     * Ajax操作失败后返回数据结构的方法
     * @param string $msg 提示信息
     * @param ?array $data 数据
     * @param int $code 状态码
     * @return void 返回一个结果集
     */
    function error($msg, $data = null, $code = 0)
    {
        echo json_encode(['msg' => $msg, 'data' => $data, 'code' => $code]);
        exit;
    }
}

if (!function_exists('showMsg')) {
    /**
     * 提示信息并且跳转的函数
     * @param string $msg 提示信息
     * @param string $url 跳转地址
     * @return void 输出结构
     */
    function showMsg($msg, $url = null)
    {
        if ($url) {
            echo "<script>
                alert('$msg');
                location.href = '$url';
            </script>";
            exit;
        } else {
            echo "<script>
                alert('$msg');
                history.back();
            </script>";
            exit;
        }
    }
}

if (!function_exists('build_randstr')) {
    /**
     * 获得随机字符串
     * @param $len             需要的长度
     * @param $special        是否需要特殊符号
     * @return string       返回随机字符串
     */
    function build_randstr($len = 8, $special = false)
    {

        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );

        if ($special) {
            // array_merge — 合并一个或多个数组
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }

        // count: 数组中的长度
        $charsLen = count($chars) - 1;
        //shuffle — 打乱数组
        shuffle($chars);
        $str = null;
        for ($i = 0; $i < $len; $i++) {
            // 随机取出一位  mt_rand:返回随机整数
            $str .= $chars[mt_rand(0, $charsLen)];
        }
        return $str;
    }
}

if (!function_exists('build_upload')) {
    /**
     * 单图上传
     * @param string $name 字段名
     * @param string $path 指定的保存路径
     * @param array $type 图片类型
     * @param int $size 指定图片大小
     * @return array 返回结果集
     */
    function build_upload($name, $path = 'uploads', $type = ['jpg', 'jpeg', 'png', 'gif'], $size = 1048576)
    {
        // 获取当前时间
        $date = date('Ymd', time());

        // 拼接路径 uploads/20240226/
        $path = $path . '/' . $date;

        if (!is_dir($path)) {
            mkdir($path, 0755, true);
        }

        // 返回结果数组
        $result = [
            'msg' => '未知信息',
            'code' => 0,
            'data' => null
        ];

        // 获取图片的错误码
        $errorCode = $_FILES[$name]['error'];

        switch ($errorCode) {
            case 1:
                $result['msg'] = '上传大小不能超过upload_max_filesize设置的值';
                return $result;

            case 2:
                $result['msg'] = '上传大小不能超过MAX_FILE_SIZE设置的值';
                return $result;

            case 3:
                $result['msg'] = '图片上传不完整';
                return $result;

            case 4:
                $result['msg'] = '没有选择图片上传';
                return $result;
        }

        // 判断文件类型是否在指定的类型里
        $ext = pathinfo($_FILES[$name]['name'], PATHINFO_EXTENSION);

        // var_dump($_FILES[$name]);
        // exit;

        if (!in_array($ext, $type)) {
            $result['msg'] = '上传图片的类型错误';
            return $result;
        }

        // 判断是否超过指定大小
        if ($size < $_FILES[$name]['size']) {
            $result['msg'] = '图片过大,请压缩后上传';
            return $result;
        }

        // 定义图片的新名称
        $filename = date('YmdHis', time()) . mt_rand(1000, 9999) . mt_rand(1000, 9999) . '.' . $ext;

        if (is_uploaded_file($_FILES[$name]['tmp_name'])) {
            if (@move_uploaded_file($_FILES[$name]['tmp_name'], $path . '/' . $filename) === true) {
                $result['msg'] = '图片上传成功';
                $result['code'] = 1;
                $result['data'] = '/' . $path . '/' . $filename;
            } else {
                $result['msg'] = '图片上传错误';
            }
        } else {
            $result['msg'] = '图片上传错误';
        }

        return $result;
    }
}
if (!function_exists('check_auth')) {
    /**
     * 验证是否登录
     */
    function check_auth()
    {
        $auth = !empty($_COOKIE['auth']) ? json_decode($_COOKIE['auth'], true) : [];

        if (empty($auth)) {
            showMsg('请先登录', 'login.php');
        }

        $id = $auth['id'] ?? '';
        $username = $auth['username'] ?? '';

        // 通过id和用户名查询数据，该管理员是否存在
        $sql = "SELECT * FROM `pre_admin` WHERE `id` = '$id' AND `username` = '$username'";

        $admin = find($sql);

        if (!$admin) {
            setcookie('auth', null, time() - 1);
            showMsg('非法登录', 'login.php');
        }

        return $admin;
    }
}
if (!function_exists('getUrl')) {
    /**
     * 获取地址并且重组
     */
    function getUrl()
    {
        // 获取当前的完整地址 获取当前运行的脚本
        $url = $_SERVER['PHP_SELF'] . '?';

        if ($_GET) {
            foreach ($_GET as $key => $val) {
                if ($key != 'page') {
                    $url .= $key . '=' . $val . '&';
                }
            }
        }

        return $url;
    }
}
if (!function_exists('showPage')) {
    /**
     * 输出分页
     * @param string|int $current 当前页
     * @param string|int $count 数据总数
     * @param int $limit 每页显示多少条数据
     * @param string $class 分页样式
     * @param int $size 页码
     * @return string 输出分页结构
     */
    function showPage($current, $count, $limit = 10, $class = 'digg', $size = 5)
    {
        // 结构变量
        $page = '';

        // 判断是否需要分页
        if ($limit < $count) {
            // 分页总数
            $pageCount = ceil($count / $limit);

            // 获取url
            $url = getUrl();

            // 开始
            $page = '<div class="' . $class . '">';

            if ($current == 1) {
                $page .= '<span class="disabled">首&nbsp;页</span>';
                $page .= '<span class="disabled">上一页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=1">首&nbsp;页</a>';
                $page .= '<a href="' . $url . 'page=' . ($current - 1) . '">上一页</a>';
            }

            /* 
                [1] 2 3 4 5
                1 [2] 3 4 5
                1 2 [3] 4 5
                1 2 3 [4] 5
                1 2 3 4 [5]
                2 3 4 5 [6]
            */
            // 中间页码
            if ($current <= floor($size / 2)) {
                // 靠左计算
                $start = 1;
                // 如果总页数大于中间显示多少页,结束数字就是中间显示多少页的数字,否则结束数字就是总页数
                $end = $pageCount < $size ? $pageCount : $size;
            } elseif ($current >= $pageCount - floor($size / 2)) {
                // 当前页在中间位置靠右 避免页数出现0或者负数
                $start = $pageCount - $size + 1 <= 0 ? 1 : $pageCount - $size + 1;
                $end = $pageCount;
            } else {
                // 当前页刚好在中间位置
                $start = $current - floor($size / 2);
                $end = $current + floor($size / 2);
            }

            for ($i = $start; $i <= $end; $i++) {
                if ($i == $current) {
                    $page .= '<span class="current">' . $i . '</span>';
                } else {
                    $page .= '<a href="' . $url . 'page=' . $i . '">' . $i . '</a>';
                }
            }

            if ($current == $pageCount) {
                $page .= '<span class="disabled">下一页</span>';
                $page .= '<span class="disabled">尾&nbsp;页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=' . ($current + 1) . '">下一页</a>';
                $page .= '<a href="' . $url . 'page=' . $pageCount . '">尾&nbsp;页</a>';
            }

            // 结束
            $page .= '</div>';
        }

        return $page;
    }
}
